Problem Statement:

You are tasked with designing a user management system in a Spring Boot application. The system should adhere to the Single Responsibility Principle (SRP) from the SOLID principles. SRP states that a class should have only one reason to change, meaning that it should have only one responsibility.

Solution:

  1. Create a User Entity:

    public class User {
        private String username;
        private String password;
    
        // Constructors, getters, and setters
    }
  2. Create a UserRepository:

    import java.util.Optional;
    
    public interface UserRepository {
        Optional findByUsername(String username);
        void save(User user);
        // Additional methods for user management
    }
    import org.springframework.stereotype.Repository;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Optional;
    
    @Repository
    public class UserRepositoryImpl implements UserRepository {
        private final Map users = new HashMap<>();
    
        @Override
        public Optional findByUsername(String username) {
            return Optional.ofNullable(users.get(username));
        }
    
        @Override
        public void save(User user) {
            users.put(user.getUsername(), user);
        }
    }
  3. Create a UserService:

    import java.util.Optional;
    
    public interface UserService {
        Optional findUserByUsername(String username);
        void registerUser(User user);
        // Additional methods for user service
    }
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.Optional;
    
    @Service
    public class UserServiceImpl implements UserService {
        private final UserRepository userRepository;
    
        @Autowired
        public UserServiceImpl(UserRepository userRepository) {
            this.userRepository = userRepository;
        }
    
        @Override
        public Optional findUserByUsername(String username) {
            return userRepository.findByUsername(username);
        }
    
        @Override
        public void registerUser(User user) {
            userRepository.save(user);
        }
    }
  4. Example Usage:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.Optional;
    
    @RestController
    @RequestMapping("/users")
    public class MainController {
        private final UserService userService;
    
        @Autowired
        public MainController(UserService userService) {
            this.userService = userService;
        }
    
        @GetMapping("/{username}")
        public String getUser(@PathVariable String username) {
            Optional user = userService.findUserByUsername(username);
            return user.map(value -> "User found: " + value.getUsername()).orElse("User not found");
        }
    
        @PostMapping("/register")
        public String registerUser(@RequestBody User user) {
            userService.registerUser(user);
            return "User registered successfully";
        }
    }